package com.hejing.Lambda表达式;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * ClassName: LambdaTest01
 * Package: com.hejing.Lambda表达式
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-06-05 10:42
 * @Version: 1.0
 */
public class LambdaTest01 {

    /**
     * 语法格式1: 无参，无返回值
     */
    @Test
    public void test01(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我爱北京天安门");
            }
        };
        r1.run();
        System.out.println("**************************");
        // Lambda表达式写法
        Runnable r2 = () -> System.out.println("我爱北京天安门");
        r2.run();
    }

    /**
     * 语法格式2: Lambda 需要一个参数，但是没有返回值。
     */
    @Test
    public void test02(){
        Consumer<String> con1 = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con1.accept("顾客就是上帝");

        System.out.println("******************************");
        // Lambda 表达式写法
        Consumer<String> con2 = (String s) -> System.out.println(s);
        con2.accept("顾客就是上帝");
    }

    /**
     * 语法格式3: 数据类型可以省略，因为可以由编译器推断得出，称之为"类型推断"。
     */
    @Test
    public void test03(){
        Consumer<String> con1 = (String s) -> System.out.println(s);
        con1.accept("如果能重来，你想怎么做?");

        System.out.println("***********************");
        // 类型推断
        Consumer<String> con2 = (s) -> System.out.println(s);
        con2.accept("岁月不重来，一日难再晨");
    }

    /**
     * 语法格式4； Lambda如果只需要一个参数，参数的小括号可以省略
     */
    @Test
    public void test04(){
        Consumer<String> con1 = (s) -> System.out.println(s);
        con1.accept("世界那么大，我想去看看");

        System.out.println("*************************");
        // 省略小括号
        Consumer<String> con2 = s -> System.out.println(s);
        con2.accept("想去就去吧");
    }

    /**
     * 语法格式5: Lambda需要两个或两个以上的参数，多条执行语句，并且可以有返回值。
     */
    @Test
    public void test05(){
        Comparator<Integer> com1 = new Comparator<Integer> () {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare(12, 32));

        System.out.println("**************************");
        // Lambda表达式的写法:
        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(123, 32));
    }

    /**
     * 语法格式6: 当lambda体只有一条语句时，return与大括号若有，都可以省略。
     */
    @Test
    public void test06(){
        Comparator<Integer> com1 = (o1, o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare(123,32));

        System.out.println("**********************");
        // 当lambda体只有一条语句时，return与大括号若有，都可以省略。
        Comparator<Integer> com2 = (o1, o2) -> o1.compareTo(o2);
        System.out.println(com2.compare(23, 32));
    }
}



























